package com.woniu.gf.pawn.service.impl;

import com.baomidou.mybatisplus.core.metadata.IPage;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.woniu.gf.pawn.comm.core.domain.*;
import com.woniu.gf.pawn.comm.core.util.OssUntil;
import com.woniu.gf.pawn.dao.ImageMapper;
import com.woniu.gf.pawn.dao.ProductBigTypeIdentifyImageDefinitionBigTypeMapper;
import com.woniu.gf.pawn.dao.ProductBigTypeIdentifyImageDefinitionMapper;
import com.woniu.gf.pawn.dao.ProductBigTypeMapper;
import com.woniu.gf.pawn.product.dto.FindByBigTypeIdDto;
import com.woniu.gf.pawn.product.dto.IdentifyImageDto;
import com.woniu.gf.pawn.product.dto.ProductDto;
import com.woniu.gf.pawn.product.dto.ProductPropertyDto;
import com.woniu.gf.pawn.product.parma.FindProductBigTypePageParam;
import com.woniu.gf.pawn.service.IProductBigTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author Lucas
 * @since 2020-10-13
 */
@Service
public class ProductBigTypeServiceImpl extends ServiceImpl<ProductBigTypeMapper, ProductBigType> implements IProductBigTypeService {

    @Autowired
    private ProductBigTypeMapper bigTypeMapper;

    @Autowired
    private ImageMapper imageMapper;

    @Autowired
    private ProductBigTypeIdentifyImageDefinitionMapper bigTypeIdentifyImageDefinitionMapper;

    @Autowired
    private ProductBigTypeIdentifyImageDefinitionBigTypeMapper bigTypeIdentifyImageDefinitionBigTypeMapper;

    /**
     * 新增大类
     * @param productBigType
     * @param image
     */

    @Override
    @Transactional
    public void addProductBigType(ProductBigType productBigType, Image image, List<ProductBigTypeIdentifyImageDefinition> productBigTypeIdentifyImageDefinitions,List<ProductBigTypeIdentifyImageDefinitionBigType> productBigTypeIdentifyImageDefinitionBigTypes) {
        imageMapper.insert(image);
        productBigType.setImageId(image.getImageId());
        bigTypeMapper.insert(productBigType);
        bigTypeIdentifyImageDefinitionMapper.addProductBigTypeIdentifyImage(productBigTypeIdentifyImageDefinitions);

        for (int i=0;i<productBigTypeIdentifyImageDefinitions.size();i++){
          int definitionId=productBigTypeIdentifyImageDefinitions.get(i).getProductBigTypeIdentifyImageDefinitionId();
            productBigTypeIdentifyImageDefinitionBigTypes.get(i).setProductBigTypeIdentifyImageDefinitionId(definitionId);
            productBigTypeIdentifyImageDefinitionBigTypes.get(i).setProductBigTypeId(productBigType.getProductBigTypeId());
        }
        bigTypeIdentifyImageDefinitionBigTypeMapper.addProductBigTypeIdentifyImage(productBigTypeIdentifyImageDefinitionBigTypes);
    }

    /**
     * 查询大类商品名字是否重复
     * @param name
     * @return
     * @throws Exception
     */
    @Override
    public ProductBigType findName(String name) throws Exception {
        if(StringUtils.isNotBlank(name)){
            return bigTypeMapper.findName(name);
        }else {
            throw  new Exception("参数为空异常");

        }

    }

    /**
     * 大类分页查询
     * @param pages
     * @return
     */
    @Override
    public IPage<ProductBigType> selectPageVo(FindProductBigTypePageParam pages) {

        Page<ProductBigType> bigTypePage = new Page<>(pages.getIndex(), pages.getSize());
        IPage<ProductBigType> productBigTypeIPage = bigTypeMapper.selectPageVo(bigTypePage, pages.getName());
        return productBigTypeIPage;
    }

    /**
     * 查询大类对应的鉴定定义
     * @param bigId
     * @return
     */
    @Override
    public List<Map<String, String>> findByIdDefinition(Integer bigId) {
        return bigTypeMapper.findByIdDefinition(bigId);
    }

    /**
     * 修改大类
     * @param productBigType
     * @param productBigTypeIdentifyImageDefinitions
     * @param productBigTypeIdentifyImageDefinitionBigTypes
     */
    @Override
    @Transactional
    public void updateProductBigType(ProductBigType productBigType, List<ProductBigTypeIdentifyImageDefinition> productBigTypeIdentifyImageDefinitions, List<ProductBigTypeIdentifyImageDefinitionBigType> productBigTypeIdentifyImageDefinitionBigTypes,Image image) {
        //存在addr  说明修改了图片

       if(image.getImageAddr()!=null&&!"".equals(image.getImageAddr())){
           imageMapper.updateAddr(image.getImageAddr(),productBigType.getProductBigTypeId());
       }

       //修改大类信息

        bigTypeMapper.updateById(productBigType);

       if(productBigTypeIdentifyImageDefinitions.size()>0){
           System.out.println(productBigTypeIdentifyImageDefinitions);
           System.out.println(productBigTypeIdentifyImageDefinitionBigTypes);
           //删除鉴定定义和中间表
           System.out.println(productBigType.getProductBigTypeId()+"---");
           bigTypeIdentifyImageDefinitionBigTypeMapper.deleteDefinition(productBigType.getProductBigTypeId());

           //添加鉴定定义
           bigTypeIdentifyImageDefinitionMapper.addProductBigTypeIdentifyImage(productBigTypeIdentifyImageDefinitions);

           for (int i=0;i<productBigTypeIdentifyImageDefinitions.size();i++){
               int definitionId=productBigTypeIdentifyImageDefinitions.get(i).getProductBigTypeIdentifyImageDefinitionId();
               System.out.println(definitionId);
               productBigTypeIdentifyImageDefinitionBigTypes.get(i).setProductBigTypeIdentifyImageDefinitionId(definitionId);
               productBigTypeIdentifyImageDefinitionBigTypes.get(i).setProductBigTypeId(productBigType.getProductBigTypeId());
           }
           //添加鉴定定义中间表
           bigTypeIdentifyImageDefinitionBigTypeMapper.addProductBigTypeIdentifyImage(productBigTypeIdentifyImageDefinitionBigTypes);
       }
    }

    /**
     * 删除
     * @param bigIds
     */

    @Override
    @Transactional
    public void deleteBigType(List<Integer> bigIds) {

        bigTypeMapper.deleteBigType(bigIds);
        List<Map<Integer, String>> maps = imageMapper.deleteBigImage();
        if(maps.size()>0){
            List<Integer> list=new ArrayList<>();
            for (int i=0;i<maps.size();i++){
                for (Integer key : maps.get(i).keySet()) {
                    list.add(key);
                    OssUntil.deleteObject(maps.get(i).get(key));
                }
            }
            imageMapper.deleteBatchIds(list);
        }
    }
    @Override
    public FindByBigTypeIdDto findAllByBigTypeId(Integer bigTypeId) {
        FindByBigTypeIdDto typeIdDto = new FindByBigTypeIdDto();
        List<ProductSmallType> productSmallTypes=bigTypeMapper.findSmallTypeByBigTypeId(bigTypeId);
        typeIdDto.setProductSmallTypes(productSmallTypes);
        List<ProductBrand> productBrands=bigTypeMapper.findProductBrandByBigTypeId(bigTypeId);
        typeIdDto.setProductBrands(productBrands);
        List<ProductDto> productDtos=bigTypeMapper.findProductByBigTypeId(bigTypeId);
        typeIdDto.setProductDtos(productDtos);
        List<IdentifyImageDto> identifyImage=bigTypeMapper.findIdentifyImageDtoByBigTypeId(bigTypeId);
        typeIdDto.setIdentifyImage(identifyImage);
        for (ProductDto productDto : productDtos) {
            List<ProductPropertyDto> propertyDtos=bigTypeMapper.findProductPropertyByBigTypeId(productDto.getProductId());

            productDto.setPropertyDtos(propertyDtos);
            for (ProductPropertyDto propertyDto : propertyDtos) {
                List<ProductPropertyValue> productPropertyValues=bigTypeMapper.findProductPropertyValueByBigTypeId(propertyDto.getProductPropertyId());
                propertyDto.setProductPropertyValues(productPropertyValues);
            }
        }
        return typeIdDto;
    }

    @Override
    public List<ProductBigType> findAllBigType() {

        return bigTypeMapper.findAllBigType();
    }


}
